/** * Copyright (C) IntelliBitz Technologies., Muthu Ramadoss * 168, Medavakkam Main Road, Madipakkam, Chennai 600091, Tamilnadu, India. * http://www.intellibitz.com * training@intellibitz.com * +91 44 2247 5106 * http://groups.google.com/group/etoe * http://sted.sourceforge.net * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * STED, Copyright (C) 2007 IntelliBitz Technologies * STED comes with ABSOLUTELY NO WARRANTY; * This is free software, and you are welcome * to redistribute it under the GNU GPL conditions; * * Visit http://www.gnu.org/ for GPL License terms. */ /** * $Id: MappingEntryPanel.java 56 2007-05-19 06:47:59Z sushmu $ * $HeadURL: svn+ssh://sushmu@svn.code.sf.net/p/sted/code/FontTransliterator/trunk/src/intellibitz/sted/ui/MappingEntryPanel.java $ */ package intellibitz.sted.ui; import intellibitz.sted.actions.EntryAction; import intellibitz.sted.actions.EntryClearAction; import intellibitz.sted.actions.TableModelListenerAction; import intellibitz.sted.actions.TableRowsSelectAction; import intellibitz.sted.event.FontMapChangeEvent; import intellibitz.sted.event.FontMapChangeListener; import intellibitz.sted.event.MappingPopupListener; import intellibitz.sted.fontmap.FontMap; import intellibitz.sted.fontmap.FontMapEntry; import intellibitz.sted.util.MenuHandler; import intellibitz.sted.util.Resources; import intellibitz.sted.widgets.DocumentListenerButton; import intellibitz.sted.widgets.FontChangeTextField; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.DefaultCellEditor; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import javax.swing.border.TitledBorder; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TableModelListener; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.Iterator; import java.util.Map; public class MappingEntryPanel extends JPanel implements FontMapChangeListener, ItemListener, ListSelectionListener, DocumentListener { private FontMap fontMap; private JTable entryTable; private JComboBox followedCombo; private JComboBox precededCombo; private JComboBox sym1Combo; private JComboBox sym2Combo; private JSplitPane splitPane; private MappingTableModel mappingTableModel; private MappingRulesPanel mappingRules; private FontChangeTextField word1; private FontChangeTextField word2; private DocumentListenerButton clearButton; private DocumentListenerButton addButton; private MappingPopupListener directMapPopupListener; private EntryAction entryAction; public MappingEntryPanel() { super(); } public void init() { final TitledBorder titledBorder = BorderFactory.createTitledBorder( Resources.getResource(Resources.TITLE_MAPPING)); titledBorder.setTitleJustification(TitledBorder.CENTER); setBorder(titledBorder); final GridBagLayout gridBagLayout = new GridBagLayout(); setLayout(gridBagLayout); final GridBagConstraints gridBagConstraints = new GridBagConstraints(); gridBagConstraints.fill = GridBagConstraints.BOTH; gridBagConstraints.weightx = 1; gridBagConstraints.gridwidth = GridBagConstraints.REMAINDER; final JPanel preview = createWordEntryPanel(); gridBagLayout.setConstraints(preview, gridBagConstraints); // add(preview); splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); splitPane.setOneTouchExpandable(false); splitPane.setDividerLocation(0.7d); splitPane.setDividerSize(0); // the top component gets all the extra spaces splitPane.setResizeWeight(1); initTable(); final JScrollPane scroller = new JScrollPane(entryTable); gridBagConstraints.weighty = 1; gridBagLayout.setConstraints(splitPane, gridBagConstraints); // splitPane.setTopComponent(scroller); mappingRules = new MappingRulesPanel(); mappingRules.init(); mappingTableModel.addTableModelListener(mappingRules); entryTable.getSelectionModel().addListSelectionListener(this); entryTable.getSelectionModel().addListSelectionListener(mappingRules); // splitPane.setBottomComponent(mappingRules); add(splitPane); word1.requestFocus(); } public void load() { mappingRules.load(); directMapPopupListener.load(); loadTable(); entryTable.getSelectionModel().addListSelectionListener(this); entryTable.getSelectionModel().addListSelectionListener(mappingRules); word1.requestFocus(); } private void initTable() { // Create a model of the data. mappingTableModel = new MappingTableModel(); entryTable = new JTable(mappingTableModel); entryTable.setDefaultRenderer (Object.class, new MappingTableRenderer()); entryTable.setCellSelectionEnabled(true); entryTable.setColumnSelectionAllowed(false); entryTable.setShowVerticalLines(false); entryTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); entryTable.getTableHeader().setReorderingAllowed(false); sym1Combo = new JComboBox(); sym1Combo.setEditable(true); sym2Combo = new JComboBox(); sym2Combo.setEditable(true); followedCombo = new JComboBox(); followedCombo.setEditable(true); precededCombo = new JComboBox(); precededCombo.setEditable(true); entryTable.getColumnModel().getColumn(0) .setCellEditor(new DefaultCellEditor(sym1Combo)); entryTable.getColumnModel().getColumn(2) .setCellEditor(new DefaultCellEditor(sym2Combo)); entryTable.getColumnModel().getColumn(5) .setCellEditor(new DefaultCellEditor(followedCombo)); entryTable.getColumnModel().getColumn(6) .setCellEditor(new DefaultCellEditor(precededCombo)); directMapPopupListener = new MappingPopupListener(); entryTable.addMouseListener(directMapPopupListener); mappingTableModel.addTableModelListener(mappingRules); mappingTableModel.addTableModelListener(word1); } public void loadTable() { addTableModelListeners(); setTableColumnWidth(); } public MappingRulesPanel getMappingRules() { return mappingRules; } private void addTableModelListeners() { final Map<String, Action> actions = MenuHandler.getInstance().getActions(); for (Action action : actions.values()) { if (TableModelListenerAction.class.isInstance(action)) { addTableModelListener((TableModelListener) action); } if (TableRowsSelectAction.class.isInstance(action)) { addListSelectionListener((ListSelectionListener) action); ((TableRowsSelectAction) action).setTable(entryTable); } } } public void addTableModelListener(TableModelListener tableModelListener) { mappingTableModel.addTableModelListener(tableModelListener); } public void addListSelectionListener( ListSelectionListener listSelectionListener) { entryTable.getSelectionModel() .addListSelectionListener(listSelectionListener); } private void setTableColumnWidth() { final int count = mappingTableModel.getColumnCount(); for (int i = 0; i < count; i++) { switch (i) { default: entryTable.getColumnModel().getColumn(i).setPreferredWidth (mappingTableModel.getColumnName(i).length()); entryTable.getColumnModel().getColumn(i).sizeWidthToFit(); entryTable.getTableHeader().getColumnModel().getColumn(i) .setPreferredWidth (mappingTableModel .getColumnName(i).length()); entryTable.getTableHeader().getColumnModel().getColumn(i) .sizeWidthToFit(); } } } public void setFontMap(FontMap fontMap) { this.fontMap = fontMap; reset(); firePreviewTableDataChanged(); sym1Combo.updateUI(); sym2Combo.updateUI(); precededCombo.updateUI(); followedCombo.updateUI(); updateUI(); } private void reset() { clear(); word1.setFont(fontMap.getFont1()); word2.setFont(fontMap.getFont2()); precededCombo.addItem(Resources.EMPTY_STRING); followedCombo.addItem(Resources.EMPTY_STRING); sym1Combo.addItem(Resources.EMPTY_STRING); sym2Combo.addItem(Resources.EMPTY_STRING); final Iterator<String> iterator = fontMap.getEntries().getAllWords(); while (iterator.hasNext()) { final Object next = iterator.next(); sym2Combo.addItem(next); precededCombo.addItem(next); followedCombo.addItem(next); } final Iterator<String> iter = fontMap.getEntries().getWord2(); while (iter.hasNext()) { sym1Combo.addItem(iter.next()); } sym1Combo.setFont(fontMap.getFont1()); sym2Combo.setFont(fontMap.getFont2()); precededCombo.setFont(fontMap.getFont1()); followedCombo.setFont(fontMap.getFont1()); mappingTableModel.setFontMap(fontMap); final MappingTableRenderer fontPreviewTableRenderer = new MappingTableRenderer(); fontPreviewTableRenderer.setFontMap(fontMap); entryTable.setDefaultRenderer(Object.class, fontPreviewTableRenderer); setTableColumnWidth(); } public void clear() { sym1Combo.removeAllItems(); sym2Combo.removeAllItems(); followedCombo.removeAllItems(); precededCombo.removeAllItems(); } private JPanel createWordEntryPanel() { final JPanel jPanel = new JPanel(); jPanel.setLayout(new BoxLayout(jPanel, BoxLayout.X_AXIS)); word1 = new FontChangeTextField(); word1.setHorizontalAlignment(JTextField.RIGHT); // jPanel.add(word1); final JLabel jLabel = new JLabel(" = "); jLabel.setHorizontalAlignment(JLabel.CENTER); // jPanel.add(jLabel); word2 = new FontChangeTextField(); word2.setHorizontalAlignment(JTextField.LEFT); // jPanel.add(word2); addButton = new DocumentListenerButton(); final String sAdd = Resources.getResource(Resources.LABEL_ADD); addButton.setText(sAdd); addButton.setEnabled(false); entryAction = new EntryAction(); entryAction.putValue(Action.NAME, sAdd); entryAction.putValue(Action.SHORT_DESCRIPTION, "Add Mapping"); entryAction.putValue(Action.MNEMONIC_KEY, (int) 'A'); entryAction.putValue(Action.ACTION_COMMAND_KEY, sAdd); entryAction.setFontEntryPanel(this); addButton.addActionListener(entryAction); addButton.addKeyListener(entryAction); // jPanel.add(addButton); clearButton = new DocumentListenerButton(); final String sClear = Resources.getResource(Resources.LABEL_CLEAR); clearButton.setText(sClear); clearButton.setEnabled(false); final EntryClearAction clearFontMapEntryInPreviewAction = new EntryClearAction(); clearFontMapEntryInPreviewAction.putValue(Action.NAME, sClear); clearFontMapEntryInPreviewAction .putValue(Action.SHORT_DESCRIPTION, "Clear Mapping"); clearFontMapEntryInPreviewAction .putValue(Action.MNEMONIC_KEY, (int) 'C'); clearFontMapEntryInPreviewAction .putValue(Action.ACTION_COMMAND_KEY, sClear); clearFontMapEntryInPreviewAction.setFontPreviewPanel(this); clearButton.addActionListener(clearFontMapEntryInPreviewAction); // jPanel.add(clearButton); word1.getDocument().addDocumentListener(clearButton); word2.getDocument().addDocumentListener(clearButton); word1.getDocument().addDocumentListener(this); word2.getDocument().addDocumentListener(this); word2.addKeyListener(entryAction); return jPanel; } public MappingTableModel getMappingTableModel() { return mappingTableModel; } public ListSelectionModel getListSelectionModel() { return entryTable.getSelectionModel(); } public DocumentListenerButton getClearButton() { return clearButton; } public EntryAction getEntryAction() { return entryAction; } public void clearPreviewDisplay() { word1.setText(Resources.EMPTY_STRING); word2.setText(Resources.EMPTY_STRING); } private void firePreviewTableDataChanged() { clearPreviewDisplay(); ((MappingTableModel) entryTable.getModel()).fireTableDataChanged(); } public JSplitPane getSplitPane() { return splitPane; } public FontChangeTextField getWord1() { return word1; } public FontChangeTextField getWord2() { return word2; } public void stateChanged(FontMapChangeEvent e) { setFontMap(e.getFontMap()); } public void itemStateChanged(ItemEvent e) { reset(); } /** * Called whenever the value of the selection changes. * * @param e the event that characterizes the change. */ public void valueChanged(ListSelectionEvent e) { final ListSelectionModel listSelectionModel = (ListSelectionModel) e.getSource(); final int row = listSelectionModel.getMinSelectionIndex(); if (row > -1) { showEntry(mappingTableModel.getValueAt(row)); } } private void showEntry(FontMapEntry valueAt) { word1.setText(valueAt.getFrom()); word2.setText(valueAt.getTo()); } /** * Gives notification that an attribute or set of attributes changed. * * @param e the document event */ public void changedUpdate(DocumentEvent e) { toggleAdd(); } /** * Gives notification that there was an insert into the document. The range * given by the DocumentEvent bounds the freshly inserted region. * * @param e the document event */ public void insertUpdate(DocumentEvent e) { toggleAdd(); } /** * Gives notification that a portion of the document has been removed. The * range is given in terms of what the view last saw (that is, before * updating sticky positions). * * @param e the document event */ public void removeUpdate(DocumentEvent e) { toggleAdd(); } private void toggleAdd() { addButton.setEnabled(word1.getText().length() > 0 && word2.getText().length() > 0); } }